package com.lh.tams.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.springframework.stereotype.Repository;

import com.lh.tams.controller.qo.CaseQo;
import com.lh.tams.dao.base.HibernateBaseDao;
import com.lh.tams.domain.TamsCase;
import com.lh.tams.util.DataGridModel;
import com.lh.tams.util.DateUtil;
import com.lh.tams.util.Page;
import com.lh.tams.util.Status;

@Repository
public class CaseDao extends HibernateBaseDao {
	
	/**
	 * 根据caseNo查询案件详情
	 * @param caseNo
	 * @return
	 */
	public Page query(String caseNo){
		List<Object> args=new ArrayList<Object>();
		StringBuilder hql=new StringBuilder();
		hql.append("from TamsCase t where t.caseNo=? order by t.caseNo desc");
		args.add(caseNo);
		return super.queryForList(hql.toString(), args.toArray(), 1, 10);
	}
	/**
	 * 案件查询模块  查询案件
	 * @param dgm
	 * @param caseQo
	 * @return
	 */
	public Page queryCase(DataGridModel dgm,CaseQo caseQo){
		List<Object> args=new ArrayList<Object>();
		StringBuilder hql=new StringBuilder();
		//hql.append("from TamsCase t where t.checkType="+Status.CHECK_TYPE_PASS);
		hql.append("from TamsCase t where 1=1 and t.tamsPersonByOutPerson.idBgt!=null ");
		if(caseQo.getCaseNo()!=null&&!"".equals(caseQo.getCaseNo())){
			hql.append(" and t.caseNo=?");
			args.add(caseQo.getCaseNo());
		}
		if(caseQo.getAlarmWay()!=null&&!"".equals(caseQo.getAlarmWay())){
			hql.append(" and t.alarmWay=?");
			args.add(caseQo.getAlarmWay());
		}
		if(caseQo.getDealType()>0){
			hql.append(" and t.dealType=?");
			args.add(caseQo.getDealType());
		}
		if(caseQo.getAlarmBeginDate()!=null){
			hql.append(" and t.alarmDate>=?");
			args.add(caseQo.getAlarmBeginDate());
		}
		if(caseQo.getAlarmEndDate()!=null){
			hql.append(" and t.alarmDate<?");
			args.add(DateUtil.next(caseQo.getAlarmEndDate(), 1));
		}
		if(caseQo.getOutDept()>0){
			hql.append(" and t.tamsDeptByOutDept.idBgt=?");
			args.add(caseQo.getOutDept());
		}
		if(caseQo.getOutPerson()>0){
			hql.append(" and t.tamsPersonByOutPerson.idBgt=?");
			args.add(caseQo.getOutPerson());
		}
		if(caseQo.getAlarmName()!=null&&!"".equals(caseQo.getAlarmName())){
			hql.append(" and t.alarmName like ?");
			args.add("%"+caseQo.getAlarmName()+"%");
		}
		hql.append(" order by t.caseNo desc");
		return super.queryForList(hql.toString(), args.toArray(), dgm.getPage(), dgm.getRows());
	}
	
	public Page queryForCase(DataGridModel dgm,CaseQo caseQo){
		List<Object> args=new ArrayList<Object>();
		StringBuilder hql=new StringBuilder();
		hql.append("select t from TamsCase t left join t.tamsRegisters t2 where 1=1");
		if(caseQo.getIsOutPerson() == 0){
			hql.append(" and t.tamsPersonByOutPerson.idBgt=null ");
		}else if(caseQo.getIsOutPerson() == 1){
			hql.append(" and t.tamsPersonByOutPerson.idBgt!=null ");
		}
		
		if(caseQo.getCaseNo()!=null&&!"".equals(caseQo.getCaseNo())){
			hql.append(" and t.caseNo=?");
			args.add(caseQo.getCaseNo());
		}
		if(caseQo.getAlarmType()!=null&&!"".equals(caseQo.getAlarmType())){
			hql.append(" and t.alarmType=?");
			args.add(caseQo.getAlarmType());
		}
		if(caseQo.getAlarmWay()!=null&&!"".equals(caseQo.getAlarmWay())){
			hql.append(" and t.alarmWay=?");
			args.add(caseQo.getAlarmWay());
		}
		if(caseQo.getDealType()>0){
			hql.append(" and t.dealType=?");
			args.add(caseQo.getDealType());
		}
		if(caseQo.getWaitCheck()){
			hql.append(" and t.checkType<>?");
			args.add(caseQo.getCheckType());
		}
		if(caseQo.getCheckType()>=0){
			hql.append(" and t.checkType=?");
			args.add(caseQo.getCheckType());
		}
//		else if(caseQo.getCheckType()==-1){
//			hql.append(" and t.checkType=?");
//			args.add(Status.CHECK_TYPE_WAIT);
//		}
		if(caseQo.getCaseAddress()!=null&&!"".equals(caseQo.getCaseAddress())){
			hql.append(" and t.caseAddress like ?");
			args.add("%"+caseQo.getCaseAddress()+"%");
		}
		if(caseQo.getAlarmBeginDate()!=null){
			hql.append(" and t.alarmDate>=?");
			args.add(caseQo.getAlarmBeginDate());
		}
		if(caseQo.getAlarmEndDate()!=null){
			hql.append(" and t.alarmDate<=?");
			args.add(DateUtil.next(caseQo.getAlarmEndDate(), 1));
		}
		if(caseQo.getInDept()>0){
			hql.append(" and t.tamsDeptByInDept.idBgt=?");
			args.add(caseQo.getInDept());
		}
		if(caseQo.getInPerson()>0){
			hql.append(" and t.tamsPersonByInPerson.idBgt=?");
			args.add(caseQo.getInPerson());
		}
		if(caseQo.getOutDept()>0){
			hql.append(" and t.tamsDeptByOutDept.idBgt=?");
			args.add(caseQo.getOutDept());
		}
		if(caseQo.getOutPerson()>0){
			hql.append(" and t.tamsPersonByOutPerson.idBgt=?");
			args.add(caseQo.getOutPerson());
		}
		if(caseQo.getAlarmName()!=null&&!"".equals(caseQo.getAlarmName())){
			hql.append(" and t.alarmName like ?");
			args.add("%"+caseQo.getAlarmName()+"%");
		}
		if(caseQo.getMajorPerson()>0){
			hql.append(" and t2.tamsPerson.idBgt=?");
			args.add(caseQo.getMajorPerson());
		}
		
		//判断是否排序
		if(dgm.getSort()!=null&&!"".equals(dgm.getSort()))
			hql.append(" order by ").append("t."+dgm.getSort()).append(" ").append(dgm.getOrder());
		return super.queryForList(hql.toString(), args.toArray(), dgm.getPage(), dgm.getRows());
	}
	
	
	public Page queryForCount(DataGridModel dgm,CaseQo caseQo){
		List<Object> args=new ArrayList<Object>();
		StringBuilder hql=new StringBuilder();
		hql.append("select t from TamsCase t left join t.tamsRegisters t2 where 1=1 and t.tamsPersonByOutPerson.idBgt!=null ");
		if(caseQo.getCaseNo()!=null&&!"".equals(caseQo.getCaseNo())){
			hql.append(" and t.caseNo=?");
			args.add(caseQo.getCaseNo());
		}
		if(caseQo.getAlarmType()!=null&&!"".equals(caseQo.getAlarmType())){
			hql.append(" and t.alarmType=?");
			args.add(caseQo.getAlarmType());
		}
		if(caseQo.getAlarmWay()!=null&&!"".equals(caseQo.getAlarmWay())){
			hql.append(" and t.alarmWay=?");
			args.add(caseQo.getAlarmWay());
		}
		if(caseQo.getDealType()>0){
			hql.append(" and t.dealType=?");
			args.add(caseQo.getDealType());
		}
		if(caseQo.getWaitCheck()){
			hql.append(" and t.checkType<>?");
			args.add(caseQo.getCheckType());
		}
		if(caseQo.getCheckType()>=0){
			hql.append(" and t.checkType=?");
			args.add(caseQo.getCheckType());
		}
//		else if(caseQo.getCheckType()==-1){
//			hql.append(" and t.checkType=?");
//			args.add(Status.CHECK_TYPE_WAIT);
//		}
		if(caseQo.getCaseAddress()!=null&&!"".equals(caseQo.getCaseAddress())){
			hql.append(" and t.caseAddress like ?");
			args.add("%"+caseQo.getCaseAddress()+"%");
		}
		if(caseQo.getAlarmBeginDate()!=null){
			hql.append(" and t.alarmDate>=?");
			args.add(caseQo.getAlarmBeginDate());
		}
		if(caseQo.getAlarmEndDate()!=null){
			hql.append(" and t.alarmDate<=?");
			args.add(DateUtil.next(caseQo.getAlarmEndDate(), 1));
		}
		if(caseQo.getInDept()>0){
			hql.append(" and t.tamsDeptByInDept.idBgt=?");
			args.add(caseQo.getInDept());
		}
		if(caseQo.getInPerson()>0){
			hql.append(" and t.tamsPersonByInPerson.idBgt=?");
			args.add(caseQo.getInPerson());
		}
		if(caseQo.getOutDept()>0){
			hql.append(" and t.tamsDeptByOutDept.idBgt=?");
			args.add(caseQo.getOutDept());
		}
		if(caseQo.getOutPerson()>0){
			hql.append(" and t.tamsPersonByOutPerson.idBgt=?");
			args.add(caseQo.getOutPerson());
		}
		if(caseQo.getAlarmName()!=null&&!"".equals(caseQo.getAlarmName())){
			hql.append(" and t.alarmName like ?");
			args.add("%"+caseQo.getAlarmName()+"%");
		}
		if(caseQo.getMajorPerson()>0){
			hql.append(" and t2.tamsPerson.idBgt=?");
			args.add(caseQo.getMajorPerson());
		}
		
		//判断是否排序
		if(dgm.getSort()!=null&&!"".equals(dgm.getSort()))
			hql.append(" order by ").append("t."+dgm.getSort()).append(" ").append(dgm.getOrder());
		return super.queryForList(hql.toString(), args.toArray(), dgm.getPage(), dgm.getRows());
	}
	
	public Page queryForCheck(DataGridModel dgm,CaseQo caseQo){
		List<Object> args=new ArrayList<Object>();
		StringBuilder hql=new StringBuilder();
		hql.append("select t from TamsCase t left join t.tamsRegisters t2 where 1=1");
		if(caseQo.getCaseNo()!=null&&!"".equals(caseQo.getCaseNo())){
			hql.append(" and t.caseNo=?");
			args.add(caseQo.getCaseNo());
		}
		if(caseQo.getAlarmType()!=null&&!"".equals(caseQo.getAlarmType())){
			hql.append(" and t.alarmType=?");
			args.add(caseQo.getAlarmType());
		}
		if(caseQo.getAlarmWay()!=null&&!"".equals(caseQo.getAlarmWay())){
			hql.append(" and t.alarmWay=?");
			args.add(caseQo.getAlarmWay());
		}
		if(caseQo.getDealType()>0){
			hql.append(" and t.dealType=?");
			args.add(caseQo.getDealType());
		}
		if(caseQo.getWaitCheck()){
			hql.append(" and t.checkType<>?");
			args.add(caseQo.getCheckType());
		}
		if(caseQo.getCheckType()>=0){
			hql.append(" and t.checkType=?");
			args.add(caseQo.getCheckType());
		}else if(caseQo.getCheckType()==-1){
			hql.append(" and t.checkType=?");
			args.add(Status.CHECK_TYPE_WAIT);
		}
		if(caseQo.getAlarmBeginDate()!=null){
			hql.append(" and t.alarmDate>=?");
			args.add(caseQo.getAlarmBeginDate());
		}
		if(caseQo.getAlarmEndDate()!=null){
			hql.append(" and t.alarmDate<?");
			args.add(DateUtil.next(caseQo.getAlarmEndDate(), 1));
		}
		if(caseQo.getInDept()>0){
			hql.append(" and t.tamsDeptByInDept.idBgt=?");
			args.add(caseQo.getInDept());
		}
		if(caseQo.getInPerson()>0){
			hql.append(" and t.tamsPersonByInPerson.idBgt=?");
			args.add(caseQo.getInPerson());
		}
		if(caseQo.getOutDept()>0){
			hql.append(" and t.tamsDeptByOutDept.idBgt=?");
			args.add(caseQo.getOutDept());
		}
		if(caseQo.getOutPerson()>0){
			hql.append(" and t.tamsPersonByOutPerson.idBgt=?");
			args.add(caseQo.getOutPerson());
		}
		if(caseQo.getAlarmName()!=null&&!"".equals(caseQo.getAlarmName())){
			hql.append(" and t.alarmName like ?");
			args.add("%"+caseQo.getAlarmName()+"%");
		}
		if(caseQo.getMajorPerson()>0){
			hql.append(" and t2.tamsPerson.idBgt=?");
			args.add(caseQo.getMajorPerson());
		}
		
		//判断是否排序
		if(dgm.getSort()!=null&&!"".equals(dgm.getSort()))
			hql.append(" order by ").append("t."+dgm.getSort()).append(" ").append(dgm.getOrder());
		return super.queryForList(hql.toString(), args.toArray(), dgm.getPage(), dgm.getRows());
	}
	
	public Page queryForOut(DataGridModel dgm,CaseQo caseQo){
		List<Object> args=new ArrayList<Object>();
		StringBuilder hql=new StringBuilder();
		hql.append("select t from TamsCase t left join t.tamsRegisters t2 where 1=1 and t.tamsPersonByOutPerson.idBgt!=null");
		if(caseQo.getCaseNo()!=null&&!"".equals(caseQo.getCaseNo())){
			hql.append(" and t.caseNo=?");
			args.add(caseQo.getCaseNo());
		}
		if(caseQo.getAlarmType()!=null&&!"".equals(caseQo.getAlarmType())){
			hql.append(" and t.alarmType=?");
			args.add(caseQo.getAlarmType());
		}
		if(caseQo.getAlarmWay()!=null&&!"".equals(caseQo.getAlarmWay())){
			hql.append(" and t.alarmWay=?");
			args.add(caseQo.getAlarmWay());
		}
		if(caseQo.getDealType()>0){
			hql.append(" and t.dealType=?");
			args.add(caseQo.getDealType());
		}
		if(caseQo.getWaitCheck()){
			hql.append(" and t.checkType<>?");
			args.add(caseQo.getCheckType());
		}
		if(caseQo.getCheckType()>=0){
			hql.append(" and t.checkType=?");
			args.add(caseQo.getCheckType());
		}
		
		if(caseQo.getDistributeStatus()>=0){
			hql.append(" and t.distributeStatus=?");
			args.add(caseQo.getDistributeStatus());
		}else if(caseQo.getDistributeStatus()==-1){
			hql.append(" and t.distributeStatus=?");
			args.add(Status.CASE_DISTRIBUTE_NO);
		}
		
		if(caseQo.getAlarmBeginDate()!=null){
			hql.append(" and t.alarmDate>=?");
			args.add(caseQo.getAlarmBeginDate());
		}
		if(caseQo.getAlarmEndDate()!=null){
			hql.append(" and t.alarmDate<?");
			args.add(DateUtil.next(caseQo.getAlarmEndDate(), 1));
		}
		if(caseQo.getInDept()>0){
			hql.append(" and t.tamsDeptByInDept.idBgt=?");
			args.add(caseQo.getInDept());
		}
		if(caseQo.getInPerson()>0){
			hql.append(" and t.tamsPersonByInPerson.idBgt=?");
			args.add(caseQo.getInPerson());
		}
		if(caseQo.getOutDept()>0){
			hql.append(" and t.tamsDeptByOutDept.idBgt=?");
			args.add(caseQo.getOutDept());
		}
		if(caseQo.getOutPerson()>0){
			hql.append(" and t.tamsPersonByOutPerson.idBgt=?");
			args.add(caseQo.getOutPerson());
		}
		if(caseQo.getAlarmName()!=null&&!"".equals(caseQo.getAlarmName())){
			hql.append(" and t.alarmName like ?");
			args.add("%"+caseQo.getAlarmName()+"%");
		}
		if(caseQo.getMajorPerson()>0){
			hql.append(" and t2.tamsPerson.idBgt=?");
			args.add(caseQo.getMajorPerson());
		}
		
		//判断是否排序
		if(dgm.getSort()!=null&&!"".equals(dgm.getSort()))
			hql.append(" order by ").append("t."+dgm.getSort()).append(" ").append(dgm.getOrder());
		return super.queryForList(hql.toString(), args.toArray(), dgm.getPage(), dgm.getRows());
	}
	
	public void delete(long[] ids){
		for(int i=0;i<ids.length;i++){
			super.deleteByCaseNo("tams_common", getCaseById(ids[i]).getCaseNo());
			super.deleteByCaseNo("tams_simple", getCaseById(ids[i]).getCaseNo());
			super.deleteByCaseNo("tams_party", getCaseById(ids[i]).getCaseNo());
			super.deleteByCaseId("tams_register", ids[i]);
			super.deleteByCaseId("tams_identify", ids[i]);
			super.deleteByCaseId("tams_confirm", ids[i]);
			super.deleteByCaseId("tams_deal", ids[i]);
			super.deleteByCaseId("tams_close", ids[i]);
			super.deleteByCaseId("tams_record", ids[i]);
		}
		super.delete("tams_case", ids);
	}
	
	public TamsCase getCaseById(long id){
		return getHibernateTemplate().get(TamsCase.class, id);
	}
	
	/**
	 * 根据caseNo查询case
	 * @param caseNo
	 * @return
	 */
	public TamsCase getCaseByNo(String caseNo){
		List<Object> args=new ArrayList<Object>();
		StringBuilder hql=new StringBuilder();
		hql.append("from TamsCase t where t.caseNo=?");
		args.add(caseNo);
		Page page = super.queryForList(hql.toString(), args.toArray(), 1, 100);
		List<TamsCase> lists = (List<TamsCase>)page.getRows();
		if(lists.size()>0){
			return lists.get(0);
		}else{
			return null;
		}
	}
	
	/**
	 * 批量存取
	 * @param list
	 */
	public void addBatch(List<TamsCase> list){
		Session session= getSession();
		for(int i=0;i<list.size();i++){
			try{
				add(list.get(i));
			}catch(Exception e){
				logger.error(list.get(i).getCaseNo()+"导入失败！",e);
				continue;//抛出异常，无所谓，继续
			}
			if(i%20==0){
				session.flush();
				session.clear();
			}
		}
	}
}
